﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TrabalhoIA.Domain;
using ConsoleApplication1.DAO;
using System.Threading;

namespace ConsoleApplication1
{
    class Program
    {
        private static Double limear = -1;
        private static Negocios.RedesNeurais redeReurais = new Negocios.RedesNeurais();
        private static EntradasDAO entradasDAO = new EntradasDAO();
        static void Main(string[] args)
        {
            String opc = "N";
            do
            {
                List<Double> pesos = new List<Double>();
                List<Entrada> entradas = entradasDAO.buscaEntradasTeste();
                Int32 iteracoes = 0;
                Int32 linhas = 0;
                Int32 tentativas = 0;
                Int32 testes;
                pesos.Add(0.5);
                pesos.Add(0.4);
                pesos.Add(-0.6);
                pesos.Add(0.6);

                Console.Clear();
                Console.WriteLine("---- Iniciando sistema ----");
                do
                {
                    Console.WriteLine("---- Iniciando ciclo ----");
                    Console.WriteLine("---- Pesos iniciais ----");

                    foreach (var item in pesos)
                    {
                        Console.WriteLine(item);
                    }

                    List<Double> pesosAnt = null;
                    Console.WriteLine("---- Inicio de aprendizagem ----");
                    if (entradas.Count == linhas)
                    {
                        linhas = 0;
                    }
                    do
                    {
                        pesosAnt = pesos;

                        iteracoes++;

                        if (entradas[linhas].entradas.Count == 3) entradas[linhas].entradas.Add(limear);
                        pesos = redeReurais.treina(entradas[linhas].resultado, 0.4, pesos, entradas[linhas].entradas);
                        linhas++;

                    } while (entradas.Count != linhas);


                    Console.WriteLine("---- Pesos pós aprendizagem ----");
                    foreach (var item in pesos)
                    {
                        Console.WriteLine(item);
                    }

                    Console.WriteLine("\n---------------\nIterações: " + iteracoes);

                    Console.WriteLine("---- Início dos testes ----");

                    testes = 0;
                    Console.WriteLine("Item\tEntradas\t\t\tRes. Esp.\tAtingiu");
                    foreach (var item in entradas)
                    {
                        if (item.entradas.Count == 3) item.entradas.Add(limear);
                        Boolean result = redeReurais.testar(pesos, item.entradas, item.resultado);
                        String entrada = "";
                        foreach (var textos in item.entradas)
                        {
                            entrada += textos + "\t";
                        }


                        Console.WriteLine(++testes + "\t" + entrada + (item.resultado.ToString().Length.Equals(2) ? item.resultado.ToString() : " " + item.resultado.ToString()) + "\t\t" + result);
                        if (!result) break;
                    }


                    Console.WriteLine("---- Fim dos testes ----");

                    if (testes == entradas.Count) Console.WriteLine("---- Fim da coleção de dados ----");

                    tentativas++;
                    Console.WriteLine();
                } while (testes < entradas.Count);

                entradas = entradasDAO.buscaEntradas();

                Console.WriteLine("Item\tEntradas\t\t\t\tResultado\n");
                
                testes = 0;
                foreach (var item in entradas)
                {
                    if (item.entradas.Count == 3) item.entradas.Add(limear);
                    Double resultado = redeReurais.classificar(pesos, item.entradas);
                    String entrada = "";
                    foreach (var textos in item.entradas)
                    {
                        entrada += textos + "\t";
                    }
                    
                    Console.WriteLine(++testes + "\t" + entrada + "\t" + (resultado.Equals(-1) ? "Petroleo 1" : "Petroleo 2"));


                }


                Console.Read();
                Console.WriteLine("Numero de tentativas dentro da coleção: " + tentativas);


                Console.WriteLine("Deseja reiniciar?(S/N)");

                do
                {
                    opc = Console.ReadLine();
                } while (!opc.ToUpper().Equals("S") && !opc.ToUpper().Equals("N"));
            } while (opc.ToUpper().Equals("S"));


            Console.Clear();

            Console.WriteLine(" ======================================================================");


            Console.WriteLine("|\t\t\t\t\tAté logo\t\t\t|");
            Console.WriteLine(" ======================================================================");

            Thread.Sleep(500);
        }


    }
}
